#ifndef CSVEXPORTER_H
#define CSVEXPORTER_H

#include <QObject>
#include <QString>
#include <QDateTime>
#include <QTextStream>

/**
 * @brief CSV 导出服务类
 * @details 将数据库中的数据导出为 CSV 格式：
 *          - 支持导出实时数据、分钟统计、小时统计
 *          - UTF-8 with BOM 编码（兼容 Excel）
 *          - 可配置时间范围和设备过滤
 *          - 自动格式化数值精度
 */
class CsvExporter : public QObject
{
    Q_OBJECT

public:
    // 导出数据类型
    enum ExportType
    {
        RealtimeData,     // 实时数据
        MinuteStatistics, // 分钟统计
        HourStatistics    // 小时统计
    };
    Q_ENUM(ExportType)

    explicit CsvExporter(QObject *parent = nullptr);
    ~CsvExporter();

    /**
     * @brief 导出实时数据
     * @param filePath 导出文件路径
     * @param deviceId 设备ID（空字符串表示所有设备）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 是否成功
     */
    bool exportRealtimeData(const QString &filePath,
                            const QString &deviceId = QString(),
                            const QDateTime &startTime = QDateTime(),
                            const QDateTime &endTime = QDateTime());

    /**
     * @brief 导出分钟统计数据
     * @param filePath 导出文件路径
     * @param deviceId 设备ID（空字符串表示所有设备）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 是否成功
     */
    bool exportMinuteStatistics(const QString &filePath,
                                const QString &deviceId = QString(),
                                const QDateTime &startTime = QDateTime(),
                                const QDateTime &endTime = QDateTime());

    /**
     * @brief 导出小时统计数据
     * @param filePath 导出文件路径
     * @param deviceId 设备ID（空字符串表示所有设备）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 是否成功
     */
    bool exportHourStatistics(const QString &filePath,
                              const QString &deviceId = QString(),
                              const QDateTime &startTime = QDateTime(),
                              const QDateTime &endTime = QDateTime());

    /**
     * @brief 获取最后一次错误信息
     */
    QString lastError() const { return m_lastError; }

signals:
    // 导出进度信号（当前行数，总行数）
    void exportProgress(int current, int total);

    // 导出完成信号
    void exportFinished(bool success, const QString &filePath);

private:
    // 通用导出方法
    bool exportData(const QString &filePath,
                    ExportType type,
                    const QString &deviceId,
                    const QDateTime &startTime,
                    const QDateTime &endTime);

    // 写入 UTF-8 BOM
    bool writeUtf8Bom(QTextStream &stream);

    // 设置错误信息
    void setError(const QString &error);

private:
    QString m_lastError; // 最后一次错误信息
};

#endif // CSVEXPORTER_H
